在第八天我們已得知既有的Autowird與Qualifier等常用的注入方式,今天這章節會介紹一個較少人使用的@Resource注入方式,@Resource註解與@Autowired差別在哪呢?@Resource整合了@Autowird與@Qualifier兩項註解之一的功能,故除了可以自動注入獲取所需的各類元件(@Component),亦可注入JNDI(Java Naming and Directory Interface)此種應用程式程式設計介面,故此項註解整合了相當多以往開發者所需的資源注入方式,可提供給開發者做參考使用
資源註解(@Resource Annotation)大部分所有核心工作都在ConfigurationClassParser此類別元件完成,此階段會經由多個類別進行邏輯分析與轉導取得相關屬性資源,分為兩項屬性資源,第一類型,一般元件資源,如服務(@Service)、元件(@Component)或倉儲庫(@Repository)資源,皆透過ResourcePropertySource此類別元件取得相關Bean的屬性資源,第二種類型,透過JndiPropertySource類別元件取得JNDI屬性資源,當取得對應的屬性資源後即可注入對應方法(Method)、類別(Class)、宣告參數(Field),透過以下簡單範例示範如何取得元件提供各位開發者作參考。
配置一個簡單的模組組件(bean)
@Configuration
public class BeanConfig {
@Bean("MyLove")
public MovieCandidate getMovieWedding() {
.....
.....
.....
}
透過資源註解自動注入
public class MovieCandidateTestSuite extends ServiceTestBase {
@Resource(name="MyLove",description="Get bean by beanName")
MovieCandidate myLove;
@Test
public void testCandidateForMyLove() {
assertEquals(myLove.getName(),"My Love");
assertEquals(myLove.getLang(), LanguageEunm.CN);
System.out.println("Get My Love Bean from Resource verify success");
}
}
透過簡單的範例,我們可以看到資源註解(@Resource)相當方便,亦可提供敘述欄位給開發者提醒相關合作夥伴此元件為何種類型、用途為何,也整合了多種資源可注入開發者所需環境。
在Resource註解中,我們可以看到這(如圖一所示)可適用任何一種介面、類別、方法及宣告欄位類別等之上的注入式模式註解,亦可透過多資源註解(Resources)中,一次性的注入多項元件進行對應您的元件,已有相當大的彈性進行各項資源對應,提供的多項方法提供開發者進行操作使用,name及type用來獲取相對應的元件類別,AuthenticationType用來判定是使用何種類型元件進行驅動,如:Application為可能透過DriverManager 去取得 connection,沒有透過JVM相關容器元件,反之,一般來說類別元件都是透過BeanFactory容器進行獲取相關容器元件,而JNDI則是透過lookup及mappedName兩項方法進行取得,以便取得外部相關配置好之資源,此註解亦進一步提供shareable方法,強調此元件是否提供共用,最後再提供description來給開發者敘述元件所代表的功能與意義,如圖二所示,若未指定名稱(Name)會用預設名稱進行尋找指定元件,若尋找不到會退回裝配元件,若指定裝配名稱,必依照指定名稱進行配置,開發者可依照此架個近行評估。
圖一 @Resource structure
圖二 @Resource 裝配流程
Run test task
gradle test
Run open result html
open ./build/reports/tests/test/index.html
Resource injection test
Mind-blowing test detail
Other possible extensions to Java annotations
Spring中註解的實現原理-Autowired和Resource的區別